import { GET } from "@/request";
import { traverToNum, traverToRate } from "@/utils/formatter";
import moment from "moment/moment";
import type { RequestResultType } from "@/request";

/**
 * 创建一个映射对象，用于定义别名和数据格式化函数
 *
 * @param alias 别名，用于简化或统一表示某个数据字段
 * @param format 格式化函数，接受一个字符串或数字作为输入，并返回一个数字或字符串
 * @param coverage
 * @returns 返回一个对象，包含传入的别名和格式化函数
 */
export const commonMapping = (
	alias: string,
	format: (val: string | number, value?: any) => number | string,
	coverage = true
) => ({
	alias,
	format,
	coverage,
	isMapping: true,
});

/**
 * 获取品牌层级得分增长摘要信息
 *
 * 本函数通过GET请求获取品牌层级得分增长摘要信息，具体包括目标值、实践值和比率
 * 请求的URL、参数和映射关系被定义在函数内部请求的参数通过commonMapping函数进行处理，
 * 以确保数据类型的正确转换和处理
 *
 * @returns Promise 包含请求结果的Promise对象，具体结果类型需要根据API文档确定
 */
export const GETOverview = () => {
	return GET(
		`/report/business/queryInvestProgressSummary?day=20241120`,
		{},
		{
			// 映射目标值字段，确保数值类型的正确转换
			notOpened: {
				ma01030: commonMapping("target", (val: string | number) => traverToNum(val), true),
			},
			snapshotdate: commonMapping("deadline", (val: string | number) =>
				moment(val, "YYYYMMDD").format("YYYY-MM-DD")
			),
		}
	);
};

/**
 * 获取品牌层级得分增长率摘要报告
 *
 * 本函数通过GET请求获取品牌在特定日期的层级得分增长率摘要信息
 * 主要用于业务报告中，以帮助分析品牌得分变化趋势
 *
 * @returns Promise<APIResponse> 返回一个Promise，解析为API响应对象，包含品牌层级得分增长率摘要信息
 */
export const GETOverviews = () => {
	// 向指定的URL发送GET请求，以获取品牌层级得分增长率摘要信息
	// 此处的URL是根据特定日期动态构建的，以确保获取的数据是最新的或符合指定日期的
	return GET(
		`/report/business/queryBrandTierScoreIncreaseRateSummary?day=20241119`,
		{},
		{
			zccmzdfsqm: commonMapping("target", (val: string | number) => traverToRate(val), true),
		}
	);
};

/**
 * 获取月分解数据
 *
 * 本函数通过GET请求获取特定项目在指定日期的月分解报告数据
 * 使用了映射函数来转换和处理返回的数据，确保数据格式符合预期
 *
 * @returns {Promise<any>} 返回一个Promise，解析为处理后的月分解报告数据
 */
export const GETMonthDecomposition = () => {
	// 发起GET请求，获取月分解数据
	// 请求URL中包含了查询参数day和projId，分别表示日期和项目ID
	// 在请求配置中，使用zccmzdfsqm映射来处理返回的数据，确保数据格式一致性
	return GET(
		`/report/project/rentingMainShop/queryMonthDecomposition?day=20241126&projId=E040203`,
		{},
		{
			ma01001: commonMapping("id", (val: string | number) => val),
			ma01002: commonMapping("name", (val: string | number) => val),
			op031106: commonMapping("rate", (val: string | number) => traverToRate(val)),
		}
	);
};

/**
 * 获取区域列表
 *
 * 该函数通过GET请求从服务器获取区域列表数据它接受一个可选的参数对象，
 * 用于传递请求参数返回一个Promise对象，包含请求结果的映射
 *
 * @param _params 可选的请求参数对象，用于指定获取区域列表的条件
 * @returns 返回一个Promise对象，包含请求结果的映射
 */
export const GETManagementAreaList = (
	_params?: Record<string, any> | undefined
): Promise<RequestResultType<any>> =>
	GET(
		"/bma-reform/brand/operating",
		{},
		{
			zarea: commonMapping("value", (val: string | number) => val),
			zareaT: commonMapping("label", (val: string | number) => val),
		}
	);

/**
 * 获取区域列表
 *
 * 该函数通过GET请求从服务器获取区域列表数据它接受一个可选的参数对象，
 * 用于传递请求参数返回一个Promise对象，包含请求结果的映射
 *
 * @param _params 可选的请求参数对象，用于指定获取区域列表的条件
 * @returns 返回一个Promise对象，包含请求结果的映射
 */
export const GETAreaList = (
	_params?: Record<string, any> | undefined
): Promise<RequestResultType<any>> =>
	GET(
		"/bma-reform/brand/area",
		{},
		{
			zarea: commonMapping("value", (val: string | number) => val),
			zareaT: commonMapping("label", (val: string | number) => val),
		}
	);

/**
 * 根据搜索条件获取品牌信息
 *
 * 此函数通过GET请求从服务器获取品牌数据它接受一个可选的参数对象来定制搜索条件，
 * 并返回一个Promise对象，包含请求结果该函数使用了通用映射函数来处理特定的品牌ID字段，
 * 以确保数据的正确性和一致性
 *
 * @param _params 可选的搜索参数对象，用于指定搜索条件
 * @returns 返回一个Promise对象，包含请求结果
 */
export const GETSearchBrand = (
	_params?: Record<string, any> | undefined
): Promise<RequestResultType<any>> =>
	GET("/bma-reform/brand/search", _params, {
		zbrandidT: commonMapping(
			"label",
			(val: string | number, value: any) => {
				return `${val} (${value.zbrandid} - ${value.zbiztype2T})`;
			},
			false
		),
	});

export const GETBrandNationalTop3 = (
	_params?: Record<string, any> | undefined
): Promise<RequestResultType<any>> =>
	GET("/bma-reform/brand/brand/national/top3", _params, {
		manageDates: {
			averageDate: commonMapping("value", (val: string | number) =>
				traverToNum(val, { decimal: 2, digits: 0 })
			),
		},
		rentDate: {
			averageDate: commonMapping("value", (val: string | number) =>
				traverToNum(val, { decimal: 2, digits: 0 })
			),
		},
		monthDates: {
			averageDate: commonMapping("value", (val: string | number) =>
				traverToNum(val, { decimal: 2, digits: 4 })
			),
		},
	});

export const GETBrandOperatingTop3 = (
	_params?: Record<string, any> | undefined
): Promise<RequestResultType<any>> =>
	GET("/bma-reform/brand/brand/area/operating/top3", _params, {
		manageDates: {
			averageDate: commonMapping("value", (val: string | number) =>
				traverToNum(val, { decimal: 2, digits: 0 })
			),
		},
		rentDate: {
			averageDate: commonMapping("value", (val: string | number) =>
				traverToNum(val, { decimal: 2, digits: 0 })
			),
		},
		monthDates: {
			averageDate: commonMapping("value", (val: string | number) =>
				traverToNum(val, { decimal: 2, digits: 4 })
			),
		},
	});

/**
 * 获取区域列表
 *
 * 该函数通过GET请求从服务器获取区域列表数据它接受一个可选的参数对象，
 * 用于传递请求参数返回一个Promise对象，包含请求结果的映射
 *
 * @param _params 可选的请求参数对象，用于指定获取区域列表的条件
 * @returns 返回一个Promise对象，包含请求结果的映射
 */
export const GETUserInfo = (
	_params?: Record<string, any> | undefined
): Promise<RequestResultType<any>> => GET("/bma-reform/auth/account", {}, {});
